import unittest
import requests
from common.db_utils import clear_user_info
from api.openaccount_api import OpenAccountApi
from api.recharge_api import RechargeApi
from api.regloginapi import RegLoginApi
from api.tender_api import TenderApi
from parameterized import parameterized
from common.read_json import read_json
from common.utils import common_assert
from common.html_uilt import html_util
from common.db_utils import init_tender_info

class TestTender(unittest.TestCase):

    @classmethod
    def setUpClass(cls) -> None:
        # 借款标测试数据初始化
        init_tender_info()

    def setUp(self) -> None:
        # 创建session对象
        self.session = requests.session()
        # 调用投资模块类
        self.tender_api = TenderApi(self.session)
        # 调用登录模块类
        self.reg_login_api = RegLoginApi(self.session)

    def tearDown(self) -> None:
        # 关闭session对象
        self.session.close()

    # 投资测试用例
    @parameterized.expand(read_json('/tender','tenderapi'))
    def test01_tender(self,keywords,amount,exp_status_code,exp_status,exp_description):
        # 用户登录
        self.reg_login_api.user_login(keywords, "l123456")
        # 投资
        response = self.tender_api.tender(amount)
        json_data = response.json()
        common_assert(self,response,exp_status_code,exp_status,exp_description)

    # 第三方投资测试用例
    def test02_third_tender(self):
        self.reg_login_api.user_login("15878945622", "l123456")
        response_ten = self.tender_api.tender(1000)
        url = html_util(response_ten)[0]
        form_data = html_util(response_ten)[1]
        response_3 = self.tender_api.third_tender(url,form_data)
        self.assertIn('OK',response_3.text)

    # 投资业务流程
    def test03_tender_process(self):
        clear_user_info()
        # 将使用的数据，设置为变量，方便进行统一管理
        self.session = requests.session()
        # 实例化登录注册模块封装的类
        self.reg_login_api = RegLoginApi(self.session)
        # 实例化实名认证模块封装的类
        self.open_account_api = OpenAccountApi(self.session)
        # 实例化充值模块封装的类
        self.rechargeapi = RechargeApi(self.session)
        # 调用投资模块类
        self.tender_api = TenderApi(self.session)
        # 1.图片验证码接口
        # 通过调用封装的图片验证码接口的方法，获取响应结果
        response_t = self.reg_login_api.get_img_verify_code(512345845554)
        # 断言状态码
        self.assertEqual(200, response_t.status_code)

        # 2.获取短信验证码接口
        # 通过调用封装的短信验证码接口的方法，获取响应结果
        response_pv = self.reg_login_api.get_phone_verify_code("15878945626", "8888", "reg")
        # 断言-通用断言
        common_assert(self, response_pv, 200, 200, "成功")

        # 3.注册接口
        # 通过调用封装的注册接口的方法，获取响应结果
        response_zc = self.reg_login_api.user_register("15878945626", "l123456", "8888", "666666", "on", None)
        # 断言-通用断言
        common_assert(self, response_zc, 200, 200, "成功")

        # 4.登录接口
        # 通过调用封装的登录接口的方法，获取响应结果
        response_lo = self.reg_login_api.user_login("15878945626", "l123456")
        # 断言-通用断言
        common_assert(self, response_lo, 200, 200, "成功")

        # 5.实名认证接口
        # 通过调用封装的实名认证接口的方法，获取响应结果
        body = {'realname': "楚枫", 'card_id ': "450102199003078798"}
        response_sm = self.open_account_api.realname(body)
        json_data = response_sm.json()
        # 断言-通用断言
        common_assert(self, response_sm, 200, 200, "成功")
        # 实名认证信息断言
        self.assertEqual("楚**", json_data['data']['realname'])
        self.assertEqual("450****798", json_data['data']['card_id'])

        # 6.开户接口
        # 通过调用封装的开户接口的方法，获取响应结果
        response_kh = self.open_account_api.open_account()
        # 断言-通用断言
        common_assert(self, response_sm, 200, 200, "成功")

        # 7.第三方开户接口
        # 通过调用封装的获取第三方接口请求数据的方法，获取第三方开户接口的url和请求体数据
        url = html_util(response_kh)[0]
        form_data = html_util(response_kh)[1]
        # 通过调用封装的第三方开户接口的方法，传入url和请求体数据，获取响应结果
        response_third = self.open_account_api.third_open_account(url, form_data)
        # 断言状态码
        # 断言响应体数据
        self.assertIn('OK', response_third.text)

        # 8.获取充值验证码接口
        # 通过调用封装的获取充值验证码接口的方法，获取响应结果
        response_cy = self.rechargeapi.get_recharge_verify_code(512345845554)
        # 断言状态码
        self.assertEqual(200, response_cy.status_code)

        # 9.充值接口
        # 通过调用封装的充值接口的方法，获取响应结果
        response_cz = self.rechargeapi.recharge("500000", "8888")
        # 断言-通用断言
        common_assert(self, response_cz, 200, 200, "form")

        # 10.第三方充值接口
        # 通过调用封装的获取第三方接口请求数据的方法，获取第三方开户接口的url和请求体数据
        url = html_util(response_cz)[0]
        form_data = html_util(response_cz)[1]
        # 通过调用封装的第三方充值接口的方法，传入url和请求体数据，获取响应结果
        response_3 = self.rechargeapi.third_recharge(url, form_data)
        # 断言状态码
        # 断言响应体数据
        self.assertIn('OK', response_3.text)

        # 11.投资接口
        # 通过调用封装的投资接口的方法，获取响应结果
        response_tz = self.tender_api.tender(1000)
        # 断言-通用断言
        common_assert(self, response_tz, 200, 200, "form")

        # 12.第三方投资接口
        # 通过调用封装的获取第三方接口请求数据的方法，获取第三方开户接口的url和请求体数据
        url = html_util(response_tz)[0]
        form_data = html_util(response_tz)[1]
        # 通过调用封装的第三方投资接口的方法，传入url和请求体数据，获取响应结果
        response_3_t = self.tender_api.third_tender(url, form_data)
        # 断言状态码
        # 断言响应体数据
        self.assertIn('OK', response_3_t.text)

